package br.com.eurotrader.controller;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import br.com.eurotrader.beanssessao.SessionBean1;
import br.com.eurotrader.dao.OrdemDeServicoDao;
import br.com.eurotrader.dao.OrdemdeservicoHasEquipamentoDao;
import br.com.eurotrader.dao.OrdemdeservicoHasEquipamentoHasTempoDao;
import br.com.eurotrader.dao.OrdemdeservicoHasEquipamentoHasTipoproblemaDao;
import br.com.eurotrader.entidades.Equipamento;
import br.com.eurotrader.entidades.Ordemdeservico;
import br.com.eurotrader.entidades.OrdemdeservicoHasEquipamento;
import br.com.eurotrader.entidades.OrdemdeservicoHasEquipamentoHasTempo;
import br.com.eurotrader.entidades.OrdemdeservicoHasEquipamentoHasTipoproblema;
import br.com.eurotrader.entidades.Tipoproblema;
import br.com.eurotrader.interfaces.InterfaceEntidades;
import br.com.eurotrader.push.CentralPush;
import br.com.eurotrader.utils.AcoesEstrategias;
import br.com.eurotrader.utils.FacesUtils;
import com.icesoft.faces.component.ext.RowSelector;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;
import javax.inject.Inject;
import javax.inject.Named;

/**
 *
 * @author Edmilson
 */
@ViewScoped
@ManagedBean
public class ServOrdemDeServicoController extends BaseController<Ordemdeservico, Integer> implements Serializable {

    @EJB
    private OrdemDeServicoDao ordemDeServicoDao;
    @EJB
    private OrdemdeservicoHasEquipamentoDao ordemdeservicoHasEquipamentoDao;
    @EJB
    private OrdemdeservicoHasEquipamentoHasTipoproblemaDao ordemdeservicoHasEquipamentoHasTipoproblemaDao;
    @EJB
    private OrdemdeservicoHasEquipamentoHasTempoDao ordemdeservicoHasEquipamentoHasTempoDao;

    public ServOrdemDeServicoController() {
    }

    @PostConstruct
    public void inicializar() {
        setObjeto(new Ordemdeservico());
        setObjetoDao(ordemDeServicoDao);
        setColunasTabela("Código", "id");
        setColunasTabela("Empresa", "empresaId.nomeFantasia");
        setColunasTabela("Colaborador", "usuarioId.nomePessoa");
        setColunasTabela("Cadastro", "dataCadastro");
        setColunasTabela("Início", "DataHoraInicio");
        setColunasTabela("Fím", "dataHoraFechamento");
        setColunasTabela("Situação", "situacao");


    }

    @Override
    public void visualizandoORegistro() {
    }

    @Override
    public Object getDadosLinhas(int col, DataModel rowModel) {
        if (col == 0) {
            return ((Ordemdeservico) rowModel.getRowData()).getId();
        }
        if (col == 1) {
            return ((Ordemdeservico) rowModel.getRowData()).getEmpresaId().getNomeFantasia();
        }
        if (col == 2) {
            return ((Ordemdeservico) rowModel.getRowData()).getUsuarioId().getNomePessoa();
        }
        if (col == 3) {
            return ((Ordemdeservico) rowModel.getRowData()).getDataCadastro();
        }
        if (col == 4) {
            return ((Ordemdeservico) rowModel.getRowData()).getDataHoraInicio();
        }
        if (col == 5) {
            return ((Ordemdeservico) rowModel.getRowData()).getDataHoraFechamento();
        }
        if (col == 6) {
            return ((Ordemdeservico) rowModel.getRowData()).getSituacao();
        }
        return null;
    }

    @Override
    public Ordemdeservico getObjeto() {
        return super.getObjeto();
    }

    @Override
    public void setObjeto(Ordemdeservico objeto) {
        super.setObjeto(objeto);
    }

    public void navegar(ActionEvent event) {
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("servOrdemDeServico.jsf");
        } catch (IOException ex) {
            Logger.getLogger(ServOrdemDeServicoController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    private String realizarPreventivo = "N";

    public String getRealizarPreventivo() {
        return realizarPreventivo;
    }

    public void setRealizarPreventivo(String realizarPreventivo) {
        this.realizarPreventivo = realizarPreventivo;
    }
    ArrayList<OrdemdeservicoHasEquipamento> listaDeEquipamentos = new ArrayList<OrdemdeservicoHasEquipamento>();
    ArrayList<OrdemdeservicoHasEquipamentoHasTipoproblema> listaDeEquipamentosEquipamentoHasTipoproblemas = new ArrayList<OrdemdeservicoHasEquipamentoHasTipoproblema>();
    ArrayList<OrdemdeservicoHasEquipamentoHasTempo> listaDeEquipamentosEquipamentoHasTempos = new ArrayList<OrdemdeservicoHasEquipamentoHasTempo>();

    @Override
    public void setCollection(Collection c) {
        listaDeEquipamentos.addAll(c);
//        getObjeto().setAcaoCollection(c);
    }

    @Override
    public Collection getCollection() {
        if (listaDeEquipamentos == null) {
            listaDeEquipamentos = (new ArrayList<OrdemdeservicoHasEquipamento>());
        }
        return listaDeEquipamentos;
    }

    @Override
    public void setCollection1(Collection c) {
        listaDeEquipamentosEquipamentoHasTipoproblemas.addAll(c);
        //  getObjeto().setEstrategiaCollection(c);
    }

    @Override
    public Collection getCollection1() {
        if (listaDeEquipamentosEquipamentoHasTipoproblemas == null) {
            listaDeEquipamentosEquipamentoHasTipoproblemas = (new ArrayList<OrdemdeservicoHasEquipamentoHasTipoproblema>());
        }
        ArrayList<OrdemdeservicoHasEquipamentoHasTipoproblema> lista = new ArrayList<OrdemdeservicoHasEquipamentoHasTipoproblema>();
        if (ordemdeservicoHasEquipamentoSelecionado != null) {
            for (OrdemdeservicoHasEquipamentoHasTipoproblema oheht : listaDeEquipamentosEquipamentoHasTipoproblemas) {
                if (oheht.getEquipamentoId().getId().equals(ordemdeservicoHasEquipamentoSelecionado.getEquipamento().getId())) {
                    lista.add(oheht);
                }
            }
        }
        return lista;
    }

    @Override
    public void adicionarItem(ActionEvent event) {
        //   Collection collec = getCollection();
        if (getCollection() == null) {
            setCollection(new ArrayList<OrdemdeservicoHasEquipamento>());
        }
        if (itemSelecionado != null) {
            OrdemdeservicoHasEquipamento ordemdeservicoHasEquipamento = new OrdemdeservicoHasEquipamento(0, itemSelecionado.getId());
            ordemdeservicoHasEquipamento.setOrdemdeservico(getObjeto());
            ordemdeservicoHasEquipamento.setEquipamento((Equipamento) itemSelecionado);
            ordemdeservicoHasEquipamento.setPreventivo(realizarPreventivo);
            ordemdeservicoHasEquipamento.setSituacao("AGUARDANDO");
            ordemdeservicoHasEquipamento.setSituacaoServico("NORMAL");
            if (getCollection().contains(ordemdeservicoHasEquipamento)) {
                if (event.getComponent() != null) {
                    FacesUtils.addInfoMessage("Registro Duplicado.");
                }
                return;
            } else {
                getCollection().add(ordemdeservicoHasEquipamento);

            }
            //    setCollection(collec);
        }
    }

    @Override
    public void adicionarItem1(ActionEvent event) {
        //   Collection collec = getCollection();
        if (listaDeEquipamentosEquipamentoHasTipoproblemas == null) {
            setCollection1(new ArrayList<OrdemdeservicoHasEquipamentoHasTipoproblema>());
        }
        if (itemSelecionado1 != null) {
            if (ordemdeservicoHasEquipamentoSelecionado != null) {
                OrdemdeservicoHasEquipamentoHasTipoproblema ordemdeservicoHasEquipamentoHasTipoproblema = new OrdemdeservicoHasEquipamentoHasTipoproblema();
                ordemdeservicoHasEquipamentoHasTipoproblema.setOrdemDeServicoid(getObjeto());
                ordemdeservicoHasEquipamentoHasTipoproblema.setTipoproblemaId((Tipoproblema) itemSelecionado1);
                ordemdeservicoHasEquipamentoHasTipoproblema.setEquipamentoId(ordemdeservicoHasEquipamentoSelecionado.getEquipamento());
                if (listaDeEquipamentosEquipamentoHasTipoproblemas.contains(ordemdeservicoHasEquipamentoHasTipoproblema)) {
                    if (event.getComponent() != null) {
                        FacesUtils.addInfoMessage("Registro Duplicado.");
                    }
                    return;
                } else {
                    listaDeEquipamentosEquipamentoHasTipoproblemas.add(ordemdeservicoHasEquipamentoHasTipoproblema);

                }
            } else {
                FacesUtils.addInfoMessage("Selecione um equipamento na tabela.");
            }
            //    setCollection(collec);
        }
    }

    @Override
    public void excluirItem(ActionEvent event) {
        SessionBean1 sessionBean1 = (SessionBean1) FacesUtils.getManagedBean("sessionBean1");
        if (sessionBean1.getUsuarioConectado().equals(getObjeto().getUsuarioCriouId())) {
            if ((getCollection() != null)) {
                getCollection().remove(super.dataModelTabela.getRowData());
            }
        } else {
            FacesUtils.addInfoMessage("Somente o usuário que criou a ordem de serviço poderá excluír");
        }
    }

    @Override
    public void excluirItem1(ActionEvent event) {
        SessionBean1 sessionBean1 = (SessionBean1) FacesUtils.getManagedBean("sessionBean1");
        if (sessionBean1.getUsuarioConectado().equals(getObjeto().getUsuarioCriouId())) {
            if ((getCollection1() != null)) {
                listaDeEquipamentosEquipamentoHasTipoproblemas.remove((OrdemdeservicoHasEquipamentoHasTipoproblema) super.dataModelTabela1.getRowData());
            }
        } else {
            FacesUtils.addInfoMessage("Somente o usuário que criou a ordem de serviço poderá excluír");
        }
    }

    public void alterarSituacao(ActionEvent event) {
        if ((getCollection() != null)) {
            System.out.println("" + event.getComponent().getParent().getId());
            OrdemdeservicoHasEquipamento interfaceEntidades = (OrdemdeservicoHasEquipamento) super.dataModelTabela.getRowData();
            if (!interfaceEntidades.getSituacaoServico().equalsIgnoreCase("PAUSADO")) {
                if (interfaceEntidades.getSituacao().equals("AGUARDANDO")) {
                    if (getObjeto().getSituacao().equalsIgnoreCase("A")) {
                        getObjeto().setDataHoraInicio(new Date());
                    }
                    interfaceEntidades.setSituacao("INICIADO");
                    getObjeto().setSituacao("B");
                    interfaceEntidades.setDataHoraInicio(new Date());
                } else if ((interfaceEntidades.getSituacao().equals("INICIADO")) || (interfaceEntidades.getSituacao().equals("REINICIADO"))) {
                    interfaceEntidades.setSituacao("TERMINADO");
                    boolean todosTemSolucao = true;
                    for (OrdemdeservicoHasEquipamentoHasTipoproblema ohe : listaDeEquipamentosEquipamentoHasTipoproblemas) {
                        if (ohe.getEquipamentoId().equals(interfaceEntidades.getEquipamento())) {
                            if (ohe.getSolucao().trim().isEmpty()) {
                                todosTemSolucao = false;
                            }
                        }
                    }
                    if (todosTemSolucao) {

                        interfaceEntidades.setDataHoraFim(new Date());
                        boolean todosTerminados = true;

                        for (OrdemdeservicoHasEquipamento ohe : listaDeEquipamentos) {
                            if (!ohe.getSituacao().equalsIgnoreCase("TERMINADO")) {
                                todosTerminados = false;
                            }
                        }
                        if (todosTerminados) {
                            getObjeto().setSituacao("C");
                            getObjeto().setDataHoraFechamento(new Date());
                        }
                    } else {
                        FacesUtils.addInfoMessage("Todos os problemas devem ter solução");
                    }
                }
            }
        }
    }

    public void pausarReiniciarServico(ActionEvent event) {
        if ((getCollection() != null)) {
            OrdemdeservicoHasEquipamento interfaceEntidades = (OrdemdeservicoHasEquipamento) super.dataModelTabela.getRowData();
            if (interfaceEntidades.getSituacaoServico().equals("PAUSADO")) {
                interfaceEntidades.setSituacaoServico("NORMAL");
                interfaceEntidades.setSituacao("REINICIADO");
                OrdemdeservicoHasEquipamentoHasTempo oheht = new OrdemdeservicoHasEquipamentoHasTempo();
                oheht.setEquipamentoId(interfaceEntidades.getEquipamento());
                oheht.setOrdemdeservicoId(interfaceEntidades.getOrdemdeservico());
                oheht.setDataHoraInicio(new Date());
                listaDeEquipamentosEquipamentoHasTempos.add(oheht);
            }
            if (interfaceEntidades.getSituacaoServico().equals("NORMAL")) {
                interfaceEntidades.setSituacaoServico("PAUSADO");
                interfaceEntidades.setSituacao("PAUSADO");
                OrdemdeservicoHasEquipamentoHasTempo oheht = new OrdemdeservicoHasEquipamentoHasTempo();
                oheht.setEquipamentoId(interfaceEntidades.getEquipamento());
                oheht.setOrdemdeservicoId(interfaceEntidades.getOrdemdeservico());
                oheht.setDataHoraPausa(new Date());
                listaDeEquipamentosEquipamentoHasTempos.add(oheht);
            }
        }
    }

    public List<SelectItem> getEquipamentos() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        if (getObjeto().getEmpresaId() != null) {
            List<Equipamento> equipamentos = null;
            if (equipamentos == null) {
                equipamentos = ((CadGerEquipamentoController) FacesUtils.getManagedBean("cadGerEquipamentoController")).getObjetoDao().pesq("SELECT e FROM Equipamento e WHERE e.situacao = 'A' AND e.empresaId.id = " + getObjeto().getEmpresaId().getId(), "ORDER BY e.descricao");
            }

            items.add(new SelectItem(null, ""));
            for (Equipamento e : equipamentos) {
                items.add(new SelectItem(e, e.getDescricao()));
            }
        }
        return items;
    }
    private OrdemdeservicoHasEquipamento ordemdeservicoHasEquipamentoSelecionado;

    public OrdemdeservicoHasEquipamento getOrdemdeservicoHasEquipamentoSelecionado() {
        return ordemdeservicoHasEquipamentoSelecionado;
    }

    public void setOrdemdeservicoHasEquipamentoSelecionado(OrdemdeservicoHasEquipamento ordemdeservicoHasEquipamentoSelecionado) {
        this.ordemdeservicoHasEquipamentoSelecionado = ordemdeservicoHasEquipamentoSelecionado;
    }

    public void selecionarEquipamento(ActionEvent event) {
        if ((getCollection() != null)) {
            ordemdeservicoHasEquipamentoSelecionado = (OrdemdeservicoHasEquipamento) super.dataModelTabela.getRowData();
        }
    }

    @Override
    public Boolean validacoes(ActionEvent event) {

        return true;

    }
    @Inject
    private CentralPush centralPush;

    @Override
    public void metodoDepoisDoSalvarAtualizar() {
        if (listaDeEquipamentos != null) {
            ordemdeservicoHasEquipamentoDao.excluiTodos("WHERE ordemdeservico.id = " + getObjeto().getId());
            for (OrdemdeservicoHasEquipamento ohe : listaDeEquipamentos) {
                ohe.getOrdemdeservicoHasEquipamentoPK().setOrdemdeservicoId(getObjeto().getId());
                ordemdeservicoHasEquipamentoDao.save(ohe);
            }
        }

        if (listaDeEquipamentosEquipamentoHasTipoproblemas != null) {
            ordemdeservicoHasEquipamentoHasTipoproblemaDao.excluiTodos("WHERE ordemDeServicoid.id = " + getObjeto().getId());
            for (OrdemdeservicoHasEquipamentoHasTipoproblema ohe : listaDeEquipamentosEquipamentoHasTipoproblemas) {
                System.out.println("--" + ohe.getEquipamentoId());
                ordemdeservicoHasEquipamentoHasTipoproblemaDao.save(ohe);
            }
        }

        if (listaDeEquipamentosEquipamentoHasTempos != null) {
            ordemdeservicoHasEquipamentoHasTempoDao.excluiTodos("WHERE ordemdeservicoId.id = " + getObjeto().getId());
            for (OrdemdeservicoHasEquipamentoHasTempo ohe : listaDeEquipamentosEquipamentoHasTempos) {
                ordemdeservicoHasEquipamentoHasTempoDao.save(ohe);
            }
        }
        ordemdeservicoHasEquipamentoSelecionado = null;
        AcoesEstrategias.numero++;
        centralPush.chamarPush(null);
//        listaDeEquipamentos = null;
//        listaDeEquipamentosEquipamentoHasTempos = null;
//        listaDeEquipamentosEquipamentoHasTipoproblemas = null;
    }
    
   

    @Override
    public void inserir(ActionEvent event) {
        super.inserir(event);
        SessionBean1 sessionBean1 = (SessionBean1) FacesUtils.getManagedBean("sessionBean1");
        getObjeto().setDataCadastro(new Date());
        getObjeto().setUsuarioCriouId(sessionBean1.getUsuarioConectado());
        getObjeto().setUsuarioId(sessionBean1.getUsuarioConectado());
        listaDeEquipamentos = null;
        listaDeEquipamentosEquipamentoHasTempos = null;
        listaDeEquipamentosEquipamentoHasTipoproblemas = null;
    }

    @Override
    public void cancelar(ActionEvent event) {
        super.cancelar(event);
        ordemdeservicoHasEquipamentoSelecionado = null;
        listaDeEquipamentos = null;
        listaDeEquipamentosEquipamentoHasTempos = null;
        listaDeEquipamentosEquipamentoHasTipoproblemas = null;
    }

    @Override
    public void editar(ActionEvent event) {
        super.editar(event);
        listaDeEquipamentos = new ArrayList<OrdemdeservicoHasEquipamento>();
        listaDeEquipamentosEquipamentoHasTipoproblemas = new ArrayList<OrdemdeservicoHasEquipamentoHasTipoproblema>();
        listaDeEquipamentosEquipamentoHasTempos = new ArrayList<OrdemdeservicoHasEquipamentoHasTempo>();
        listaDeEquipamentos.addAll(ordemdeservicoHasEquipamentoDao.pesq("SELECT o FROM OrdemdeservicoHasEquipamento o WHERE o.ordemdeservico.id = " + getObjeto().getId(), ""));
        listaDeEquipamentosEquipamentoHasTipoproblemas.addAll(ordemdeservicoHasEquipamentoHasTipoproblemaDao.pesq("SELECT o FROM OrdemdeservicoHasEquipamentoHasTipoproblema o WHERE o.ordemDeServicoid.id = " + getObjeto().getId(), ""));
        listaDeEquipamentosEquipamentoHasTempos.addAll(ordemdeservicoHasEquipamentoDao.pesq("SELECT o FROM OrdemdeservicoHasEquipamentoHasTempo o WHERE o.ordemdeservicoId.id = " + getObjeto().getId(), ""));
    }
}